﻿/************************************************************************

   Extended Silverlight Toolkit

   Copyright (C) 2010-2012 Xceed Software Inc.

   This program is provided to you under the terms of the Microsoft Public
   License (Ms-PL) as published at http://extendedsilverlight.codeplex.com/license

   Please purchase a commercial version of this toolkit if you are using
   it in a commercial product. The commercial versions support the project,
   and also include more features for each control, priority support,
   source code, updates, removed watermark, and a proprietary license.

   Visit http://xceed.com and follow @datagrid on Twitter.

  **********************************************************************/

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Collections;
using System.Linq;

namespace Xceed.Silverlight.Data
{
  internal static class ListUtils
  {
    public static void RecurseCountDistinctValues<T>( IList<T> sourceList, IList<string> fieldNames, Func<string, T, object> valueProvider, long[] returnValues )
    {
      if( sourceList == null )
        throw new ArgumentNullException( "sourceList" );

      if( fieldNames == null )
        throw new ArgumentNullException( "fieldNames" );

      if( valueProvider == null )
        throw new ArgumentNullException( "valueProvider" );

      if( returnValues == null )
        throw new ArgumentNullException( "returnValues" );

      if( fieldNames.Count != returnValues.Length )
        throw new ArgumentException( "fieldNames count must be equal to returnValues lenght" );

      if( fieldNames.Count == 0 )
        return;

      ListUtils.RecurseCountDistinctValues<T>( 0, fieldNames, sourceList, valueProvider, returnValues );
    }

    private static void RecurseCountDistinctValues<T>( int startingIndex, IList<string> fieldNames, IList<T> sourceList, Func<string, T, object> valueProvider, long[] returnValues )
    {

      //Select and Count the disctinct values for this level
      IEnumerable<object> distinctValues = ( from o in sourceList
                                             select valueProvider( fieldNames[ startingIndex ], o ) ).Distinct();

      returnValues[ startingIndex ] += distinctValues.Count();

      //Iterate throught each distinct value
      if( startingIndex < ( fieldNames.Count - 1 ) )
      {
        foreach( object distinctValue in distinctValues )
        {
          IList<T> subElements = sourceList.Where( ( o ) => object.Equals( distinctValue, valueProvider( fieldNames[ startingIndex ], o ) ) ).ToList();

          ListUtils.RecurseCountDistinctValues( startingIndex + 1, fieldNames, subElements, valueProvider, returnValues );
        }
      }
    }
  }
}
